#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <cstdlib>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

union semun
{
	int					val;
	struct semid_ds		*buf;
	unsigned short		*array;
};

int init_semvalue(int sem_id, int sem_num)
{
	union semun sem_union;


	for( int i = 0; i < sem_num ; i++ )
	{
		sem_union.val = i;
		if( semctl(sem_id, i, SETVAL, sem_union) < 0 )
		{
			return -1;
		}
	}

	return 0;
}

int sem_wait(int sem_id, int sem_num)
{
	struct sembuf sem_b;

	sem_b.sem_num = sem_num;
	sem_b.sem_op = -1;
	sem_b.sem_flg = SEM_UNDO;
	//printf("before %d\n",sem_num);
	if( semop(sem_id, &sem_b, 1) < 0 )
	{
	    //	    	printf("interupt  %d and now sem is %d\n",errno,sem_num);
	    if(errno==EINTR ){
		sem_wait(sem_id,sem_num);
	
	    }
	    else {
		
		perror("semop");
		exit(-1);
	    }
	}
	
	return 0;
}

int sem_signal(int sem_id, int sem_num)
{
	struct sembuf sem_b;

	sem_b.sem_num = sem_num;
	sem_b.sem_op = 1;
	sem_b.sem_flg = SEM_UNDO;

	if( semop(sem_id, &sem_b, 1) < 0 )
	{
		perror("semop");
		exit(-1);
	}

	return 0;
}
